home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_asm / scrnprt2 / scrndmp.asm < prev   
Assembly Source File  |  1986-08-19  |  6KB  |  223 lines

  1. Title  -Utility Program to Dump the Screen to a Disk File
  2. ;(Scrndmp.asm)
  3.  
  4. Page ,132
  5. COMMENT |
  6.   This program this a memory-resident utility that uses INT 5 
  7.   (PrtSc) to dump the screen contents to a disk file.  The 
  8.   filename is chosen when the program is loaded into memory, and
  9.   remains in effect until the system is re-booted.  Each additional
  10.   use of Shift-PrtSc appends to the existing file.
  11. |END COMMENT
  12.  
  13.     ;----- (this value will change if the program is modified)
  14.   installed_filename   equ    02BAH    ; offset of filename in 
  15.                     ; program when it is installed
  16.   cr    equ    0DH
  17.   lf    equ    0AH
  18.  
  19. if1                    ; include macro library
  20.   include Lib1.ASM
  21. endif
  22. .SALL
  23.  
  24. abso    segment    at 0            ; Interrupt vector table
  25.     org    4*5H            ; vector for INT 5
  26.   print_int    DD    ?
  27. abso    ends
  28.  
  29. code    segment
  30.     org    100H
  31.     assume    cs:code,ds:code,es:code
  32. first:    jmp    start
  33.   print_vector    DD    ?        ; Save the old vector address
  34.  
  35. start:    
  36.         cls                ; clear screen
  37.     locate  3,0
  38.     writestr    msg1        ; display greeting
  39.   get_file_name:
  40.     mov    DX,offset kbd_buffer_size
  41.     mov    AH,0AH
  42.     int    21H
  43.     xor    BX,BX
  44.     mov    BL,keys_typed        ; length of file name
  45.     mov    filename[BX],0      ; place a zero terminator
  46.  
  47.   get_print_vector: 
  48.     sub    AX,AX
  49.     mov    ES,AX
  50.     assume    ES:abso            ; get original int 5H vector
  51.     mov    AX,word ptr print_int   ; and save it in print_vector
  52.     mov    BX,word ptr print_int+2
  53.     mov    word ptr print_vector,AX
  54.     mov    word ptr print_vector+2,BX
  55.     cmp    BX,0F000H        ; does it still point to BIOS?
  56.     jnz    already_loaded        ; no - this prog. probably loaded
  57.  
  58.     ; (no interrupts while setting new vectors)
  59.   change_print_vector:
  60.     cli                ; disable interrupts
  61.     mov    word ptr print_int, offset print_handler  ; offset
  62.     mov    word ptr print_int+2,CS              ; code seg
  63.     sti                ; re-enable interrupts
  64.       cls
  65.     lea    DX,prog_end        ; point to end of program
  66.     int    27H            ; exit and stay resident
  67.  
  68.   already_loaded:            ; change the output filename
  69.     cli                ; disable other interrupts
  70.     mov    si,offset filename
  71.     mov    di,installed_filename    ; DI points to offset of filename
  72.                     ; in the installed procedure.
  73.     mov    ax,bx            
  74.     mov    es,ax
  75.     mov    cx,15            ; now copy the filename into
  76.   rep   movsb                ; the installed procedure
  77.     sti                ; re-enable interrupts
  78.     cls
  79.     int    20H            ; exit, but not resident.
  80.  
  81.  
  82. ;------- This routine handles INT 17H BIOS calls
  83. ;  Output is automatically routed to <filename>.
  84.  
  85. print_handler    proc    far
  86.     assume    cs:code,ds:code,es:code
  87.     cli                ; disable outside interrupts
  88.     push    AX
  89.     push    BX
  90.     push    CX
  91.     push    DX
  92.     push    DS            ; save current DS
  93.  
  94.     push    CS            ; set DS to CS
  95.     pop    DS
  96.     call    get_screen        ; dump screen to buffer
  97.     sti                ; re-enable interrupts
  98.  
  99.   open_file_for_output:
  100.     mov    DX,offset filename
  101.     mov    AH,3DH            ; function=open
  102.     mov    AL,1            ; mode: output
  103.     int    21H            ; file handle in AX
  104.     jnc    move_file_pointer    ; file exists if no carry
  105.  
  106.   create_file:
  107.     mov    AH,3CH            ; function=create
  108.     mov    CX,0            ; file attribute=normal
  109.     int    21H            ; file handle in AX
  110.     jnc    move_file_pointer    ; no error? move pointer
  111.     writestr err1            ; if carry, then error
  112.  
  113.   move_file_pointer:
  114.     mov    BX,AX            ; file handle
  115.     mov    AH,42H            ; function=move pointer
  116.     mov    AL,2            ; move to end of file
  117.     xor    CX,CX            ; plus offset CX:DX
  118.     xor    DX,DX
  119.     int    21H    
  120.  
  121.   write_record:
  122.     mov    AH,40H            ; function: write to device
  123.     mov    CX,buffer_length    ; char count
  124.     mov    DX,offset hold_buffer
  125.     int    21H
  126.     jnc    close_file        ; no error? Close file
  127.     writestr err2            ; yes? print message
  128.  
  129.   close_file:                ; (BX contains file handle)
  130.     mov    AH,3EH            ; close file and flush buffer
  131.     int    21H    
  132.  
  133.     pop    DS            ; Restore all changed 
  134.     pop    DX            ;   registers.
  135.     pop    CX
  136.     pop    BX
  137.     pop    AX
  138.     iret                ; Return from interrupt
  139.  
  140.    err1  DB 'Error in Opening the Screen Dump File.  '
  141.          DB 'Please check the disk.',cr,lf,0
  142.    err2  DB 'Error in Writing to the Screen Dump File.  '
  143.          DB 'Please check the disk.',cr,lf,0
  144.    kbd_buffer_size    DB    14
  145.    keys_typed        DB    0
  146.    filename     DB 15 dup(' '),0    ; Must have zero terminator
  147.                     ; for the OPEN function.
  148. print_handler    endp
  149.  
  150.  
  151. ;-------------------------------------------------------------
  152. ;  This procedure takes a direct-memory snapshot of the screen
  153. ;  and saves it to a buffer.  Every other character is saved,
  154. ;  so that it may be written to a text file.
  155. ;-------------------------------------------------------------
  156.  
  157. get_screen    proc    near
  158.     push    DS
  159.     push    AX
  160.     push    CX
  161.     push    SI
  162.     push    DI
  163.  
  164.     mov    AX,0B000H    ;screen buffer for monochrome
  165.     mov    DS,AX
  166.     mov    BX,25        ;number of screen lines
  167.     xor    SI,SI
  168.     mov    DI,offset hold_buffer
  169.  
  170.   next_line:
  171.     mov    CX,80        ;characters per line
  172.   get_char:
  173.     mov    AL,[SI]        ;get screen character
  174.     mov    CS:[DI],AL    ;and place in CS:hold_buffer
  175.     add    SI,2        ;skip to next screen character
  176.     inc    DI        ;point to next position in buffer
  177.     loop    get_char    ;until CX=0
  178.  
  179.   add_crlf:    ; (add a CRLF to buffer at end of each line)
  180.     mov    byte ptr CS:[DI],0DH
  181.     mov    byte ptr CS:[DI+1],0AH
  182.     add    DI,2
  183.     dec    BX
  184.     cmp    BX,0        ;last line of screen?
  185.     jnz    next_line    ;no- do another
  186.  
  187.     pop    DI
  188.     pop    SI
  189.     pop    CX
  190.     pop    AX
  191.     pop    DS
  192.     ret
  193.  
  194. hold_buffer    DB    2050 dup(0)     ;(25*80, + (25*2-cr/lf)
  195. buffer_length   DW      $-hold_buffer
  196. buffer_end    label    byte        ; marker for end of buffer
  197.  
  198. get_screen    endp
  199.  
  200. prog_end    label    byte    ;***** End of Resident Program ******
  201.  
  202.  
  203. ;------------------- Data Area....Not resident -----------------
  204.  
  205. Msg1 DB  9,'                  S C R N D M P . C O M',cr,lf,cr,lf
  206.  DB  9,'By Kip Irvine                         (Version 1.0, 04/85)',cr,lf
  207.  DB  79 dup(0c4H),3 dup(cr,lf)
  208.  DB  9,'This is a memory-resident program that allows you to dump ',cr,lf
  209.  DB  9,'the contents of the screen at any time to a chosen filename.',cr,lf
  210.  DB  9,'For example, while using WordStar or Lotus 1-2-3, you can type',cr,lf
  211.  DB  9,'<Shift - PrtSc> to append to the disk file that was chosen',cr,lf
  212.  DB  9,'when the program was loaded.',cr,lf
  213.  DB  cr,lf
  214.  DB  9,'The same filename will be added to until this program is ',cr,lf
  215.  DB  9,'loaded again.',cr,lf
  216.  DB  9,'To clear this program from memory so that PrtSc can be used ',cr,lf
  217.  DB  9,'for its normal function, you must re-boot the system.',3 dup(cr,lf)
  218.  DB  79 dup(0c4H),cr,lf
  219.  DB  9,'Name of output file to be created?...',0
  220.  
  221. code    ends
  222.     end    first
  223.